class Person:
    name = "Leslie"  # 类属性
    def intro(self):
        print(f"{Person.name}'s age is {self.age}")

p1 = Person()
p1.age = 30  # 动态添加实例属性
p1.intro()
p1.name = "Alice"  # 修改实例属性

p2 = Person()
p2.age = 25  # 动态添加实例属性

p2.intro()

# 类属性和实例属性的区别:
# 1. 类属性是类的所有实例共享的属性，而实例属性是每个实例独有的属性。
# 2. 类属性可以通过类名直接访问，而实例属性需要通过实例对象访问。
# 3. 类属性通常用于定义类的常量或默认值，而实例属性用于存储每个实例的特定数据。
# 4. 类属性可以被类和所有实例访问，而实例属性只能被对应的实例访问。

print("-------------------------------------")
# ----- 构造函数 __init__() -----
# 属性初始化和赋值操作
class PersonWithInit:
    def __init__(self,name:str,age:int,nation:str="China"):
        self.name = name
        self.nation = nation
        self.age = age
        print("构造函数... 初始化属性")
    def play(self):
        print(f"{self.name} 的年龄是 {self.age} 岁，来自 {self.nation}，正在玩耍...")

pwi1 = PersonWithInit("Leslie",19,"China")  # 创建实例时自动调用 __init__() 方法
pwi1.play()

pwi2 = PersonWithInit("Moon",12, "China")  # 创建实例时自动调用 __init__() 方法
pwi2.play()

